﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Sped.Sped
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("SpedPisCofins.Reg0000")]
    [ComVisible(true)]
    public class Reg0000 : IBloco
    {
        /// <summary>
        /// Tipo de escrituração:
        ///     0 - Original;
        ///     1 – Retificadora.
        /// </summary>
        public string TIPO_ESCRIT { get; set; }
        /// <summary>
        /// Indicador de situação especial:
        ///     0 - Abertura;
        ///     1 - Cisão;
        ///     2 - Fusão;
        ///     3 - Incorporação;
        ///     4 - Encerramento;
        /// </summary>
        public string IND_SIT_ESP { get; set; }
        /// <summary>
        /// Número do Recibo da Escrituração anterior a ser retificada, 
        /// utilizado quando TIPO_ESCRIT for igual a 1
        /// </summary>
        public string NUM_REC_ANTERIOR { get; set; }
        /// <summary>
        /// Data inicial das informações contidas no arquivo
        /// </summary>
        public DateTime DT_INI { get; set; }
        /// <summary>
        /// Data final das informações contidas no arquivo
        /// </summary>
        public DateTime DT_FIN { get; set; }
        /// <summary>
        /// Nome da Empresa no ERP
        /// </summary>
        public string NOME { get; set; }
        /// <summary>
        /// Número de inscrição do estabelecimento matriz da
        /// pessoa jurídica no CNPJ.
        /// </summary>
        public string CNPJ { get; set; }
        /// <summary>
        /// Sigla da Unidade da Federação da pessoa jurídica
        /// </summary>
        public string UF { get; set; }
        /// <summary>
        /// Código do município do domicílio fiscal da pessoa jurídica, conforme a tabela IBGE
        /// </summary>
        public string COD_MUN { get; set; }
        /// <summary>
        /// Inscrição da pessoa jurídica na Suframa
        /// </summary>
        public string SUFRAMA { get; set; }
        /// <summary>
        /// Indicador da natureza da pessoa jurídica:
        ///     00 – Sociedade empresária em geral
        ///     01 – Sociedade cooperativa
        ///     02 – Entidade sujeita ao PIS/Pasep exclusivamente
        ///     com base na Folha de Salários
        /// </summary>
        public string IND_NAT_PJ { get; set; }
        /// <summary>
        /// Indicador de tipo de atividade preponderante:
        ///     0 – Industrial ou equiparado a industrial;
        ///     1 – Prestador de serviços;
        ///     2 - Atividade de comércio;
        ///     3 – Atividade financeira;
        ///     4 – Atividade imobiliária;
        ///     9 – Outros.
        /// </summary>
        public string IND_ATIV { get; set; }

        public override bool ValidaRegistro(ref string Erro)
        {
            var ValidacaoOK = true;
            Erro = "";

            if (string.IsNullOrEmpty(this.TIPO_ESCRIT) ||
                    (!this.TIPO_ESCRIT.Equals("0") && !this.TIPO_ESCRIT.Equals("1")))
            {
                Erro += "\r\n* Registro 0000 - Tipo de escrituração inválido.";
                ValidacaoOK = false;
            }
            if (!string.IsNullOrEmpty(this.IND_SIT_ESP) &&
                    (!this.IND_SIT_ESP.Equals("0") && !this.IND_SIT_ESP.Equals("1")
                     && !this.IND_SIT_ESP.Equals("2") && !this.IND_SIT_ESP.Equals("3")
                     && !this.IND_SIT_ESP.Equals("4")))
            {
                Erro += "\r\n* Registro 0000 - Indicador de situação especial inválido.";
                ValidacaoOK = false;
            }

            if (!(this.DT_INI.Month == this.DT_FIN.Month) || !(this.DT_INI.Year == this.DT_FIN.Year))
            {
                Erro += "\r\n* Registro 0000 - Data Inicial e Final devem pertecer ao mesmo ano/mes.";
                ValidacaoOK = false;
            }
            if (!string.IsNullOrEmpty(this.IND_NAT_PJ) &&
                    (!this.IND_NAT_PJ.Equals("00") && !this.IND_NAT_PJ.Equals("01")
                     && !this.IND_NAT_PJ.Equals("02")))
            {
                Erro += "\r\n* Registro 0000 - Indicador da natureza da pessoa jurídica inválido.";
                ValidacaoOK = false;
            }
            if (string.IsNullOrEmpty(this.IND_ATIV) ||
                    (!this.IND_ATIV.Equals("0") && !this.IND_ATIV.Equals("1")
                     && !this.IND_ATIV.Equals("2") && !this.IND_ATIV.Equals("3")
                     && !this.IND_ATIV.Equals("4") && !this.IND_ATIV.Equals("9")))
            {
                Erro += "\r\n* Registro 0000 - Indicador de tipo de atividade preponderante inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.CNPJ))
            {
                Erro += "\r\n* Registro 0000 - CNPJ da Empresa inválido.";
                ValidacaoOK = false;
            }

            if (string.IsNullOrEmpty(this.IND_SIT_ESP))
                this.IND_SIT_ESP = string.Empty;
            if (string.IsNullOrEmpty(this.NUM_REC_ANTERIOR))
                this.NUM_REC_ANTERIOR = string.Empty;
            if (string.IsNullOrEmpty(this.SUFRAMA))
                this.SUFRAMA = string.Empty;
            if (string.IsNullOrEmpty(this.IND_NAT_PJ))
                this.IND_NAT_PJ = string.Empty;

            return ValidacaoOK;
        }

        public override string Layout()
        {
            var Linha = string.Empty;

            Linha += "0000" + this.Delimitador;
            Linha += "002" + this.Delimitador;
            Linha += this.TIPO_ESCRIT.Trim() + this.Delimitador;
            Linha += this.IND_SIT_ESP.Trim() + this.Delimitador;
            Linha += this.NUM_REC_ANTERIOR.Trim() + this.Delimitador;
            Linha += this.DT_INI.FormatoDataSped() +this.Delimitador;
            Linha += this.DT_FIN.FormatoDataSped() + this.Delimitador;
            Linha += this.NOME.Trim().TirarAcento() + this.Delimitador;
            Linha += this.CNPJ.Trim().removeFormatacao() + this.Delimitador;
            Linha += this.UF.Trim() + this.Delimitador;
            Linha += this.COD_MUN.Trim() + this.Delimitador;
            Linha += this.SUFRAMA.Trim() + this.Delimitador;
            Linha += this.IND_NAT_PJ.Trim() + this.Delimitador;
            Linha += this.IND_ATIV.Trim() + this.Delimitador;

            return Linha.Trim();
        }
    }
}
